package com.timo.redis.server;

import com.timo.redis.model.ExpireTimeUnit;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.hash.ObjectHashMapper;

import java.util.Collection;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @Description: Redis hashes 操作接口 常量
 * @Author: timo
 * @Date: 2019/8/28 10:58
 */
public interface HashOperationsRedisServer {


    /**
     * 根据key将对象存入redis中，这里需要注意的是object对象不能为空否则会报错的
     *
     * @param key    键<br>
     * @param object 键值<br>
     * @return void
     * @Author timo <br/>
     * @Date 2019/8/28 11:12 <br/>
     */
    <T> void add(String key, T object);

    /**
     * 根据key将对象存入redis中，这里需要注意的是object对象不能为空否则会报错的
     *
     * @param key      键<br>
     * @param object   键值<br>
     * @param timeUnit 有效时间<br>
     * @return void
     * @Author timo <br/>
     * @Date 2019/8/28 11:33 <br/>
     */
    <T> void add(String key, T object, ExpireTimeUnit timeUnit);

    /**
     * 根据key将List数据存入redis中，这里需要注意的是list不能为null
     *
     * @param key  键<br>
     * @param list 键值<br>
     * @return void
     * @Author timo <br/>
     * @Date 2019/8/28 11:37 <br/>
     */
    <T> void addList(String key, Collection<T> list);

    /**
     * 根据key将List数据存入redis中，这里需要注意的是list不能为null
     *
     * @param key      键<br>
     * @param list     键值<br>
     * @param timeUnit 有效时间<br>
     * @return void
     * @Author timo <br/>
     * @Date 2019/8/28 11:38 <br/>
     */
    <T> void addList(String key, Collection<T> list, ExpireTimeUnit timeUnit);

    /**
     * 根据key获取对象，当没有值的时候就会返回一个null
     *
     * @param key 键<br>
     * @param cls 获取的数据类型<br>
     * @return T
     * @Author timo <br/>
     * @Date 2019/8/28 11:30 <br/>
     */
    <T> T get(String key, Class<T> cls);


    /**
     * 根据key获取List集合，当没有值的时候就会返回一个null
     *
     * @param key <br>
     * @param cls <br>
     * @return T
     * @Author timo <br/>
     * @Date 2019/8/28 11:41 <br/>
     */
    <T> T getList(String key, Class<T> cls);


    default Map<byte[], byte[]> mappedHash(Object object) {
        return new ObjectHashMapper().toHash(object);
    }






}
